/**   
* @Title: ObjectRequireFieldVerifyUtil.java 
* @Package com.txby.platformCore.component.util 
* @Description: TODO(用一句话描述该文件做什么) 
* @author jacking  
* @date 2017年11月30日 下午1:20:25 
* @version V1.0   
*/
package com.txby.platformCore.component.util;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/** 
* @ClassName: ObjectRequireFieldVerifyUtil 
* @Description: TODO(这里用一句话描述这个类的作用) 
* @author jacking
* @date 2017年11月30日 下午1:20:25 
*  
*/

public class ObjectRequireFieldVerifyUtil {
	 /**
     * 判断该对象所有属性项是否都为null
    * @Title: isAllFieldNull 
    * @Description: TODO(这里用一句话描述这个方法的作用) 
    * @param @param obj
    * @param @return
    * @param @throws Exception    设定文件 
    * @return boolean    返回类型 
    * @throws
     */
    public static boolean isAllFieldNull(Object obj) {
        Class stuCla = (Class) obj.getClass();// 得到类对象
        Field[] fs = stuCla.getDeclaredFields();//得到属性集合
        boolean flag = true;
        for (Field f : fs) {//遍历属性
            f.setAccessible(true); // 设置属性是可以访问的(私有的也可以)
            Object val;
			try {
				val = f.get(obj);
				if(val!=null) {//只要有1个属性不为空,那么就不是所有的属性值都为空
					flag = false;
					break;
				}
			} catch (IllegalArgumentException | IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}// 得到此属性的值
        }
        return flag;
    }
     
    /**
     * 获取对象所有属性字段名称集合
    * @Title: isAllFieldNull 
    * @Description: TODO(这里用一句话描述这个方法的作用) 
    * @param @param obj
    * @param @return
    * @param @throws Exception    设定文件 
    * @return boolean    返回类型 
    * @throws
     */
    public static List<String> getObjectFieldNamesList(Object obj) {
    	List<String> fields=new ArrayList<>();
        Class stuCla = (Class) obj.getClass();// 得到类对象
        Field[] fs = stuCla.getDeclaredFields();//得到属性集合
        boolean flag = true;
        for (Field f : fs) {//遍历属性
            f.setAccessible(true); // 设置属性是可以访问的(私有的也可以)
            try {
				Object val = f.get(obj);
				String fieldName=f.getName();
				fields.add(fieldName);
			} catch (IllegalArgumentException | IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}// 得到此属性的值
        }
        return fields;
    }
    /**
     * 判断该对象必填属性项是否有一个为null
    * @Title: isAllFieldRequiredOfNull 
    * @Description: TODO(这里用一句话描述这个方法的作用) 
    * @param @param obj
    * @param @param excludeField 帮除不必填项字段
    * @param @return
    * @param @throws Exception    设定文件 
    * @return boolean    返回类型 
    * @throws
     */
    public static Map isAllFieldRequiredOfNull(Object obj,List<String> excludeField) {
    	Map data=new HashMap();
    	data.put("flag", false);
    	data.put("fields", "");
    	Class stuCla = (Class) obj.getClass();// 得到类对象
    	Field[] fs = stuCla.getDeclaredFields();//得到属性集合
    	String fields="";
    	boolean flag = false;
    	for (Field f : fs) {//遍历属性
    		f.setAccessible(true); // 设置属性是可以访问的(私有的也可以)
    		Object val;
			try {
				// 得到此属性的值
				val = f.get(obj);
				String fieldName=f.getName();
	    		if(excludeField!=null&&excludeField.size()!=0){
	    			if(excludeField.contains(f.getName())){
	    				continue;
	    			}else{
	    				if(val==null) {//只要有1个属性不为空,那么就不是所有的属性值都为空
	        				if(!flag){
	        					flag = true;
	        				}
	        				fields+=fieldName+",";
	        			}
	    				
	    			}
	    			
	    		}else{
	    			if(val==null) {//只要有1个属性不为空,那么就不是所有的属性值都为空
	    				if(!flag){
	    					flag = true;
	    				}
	    				fields+=fieldName+",";
//	    				break;
	    			}
	    		}
			} catch (IllegalArgumentException | IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    		
    	}
    	if(!fields.equals("")){
    		fields=fields.substring(0, fields.length()-1);
    	}
    	data.put("flag", flag);
    	data.put("fields", fields);
    	return data;
    }

}
